package blog.util;

import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class StringUtils {

  public static boolean isEmpty(String str){
    return str == null || "".equals(str);
  }

  /**
   * 驼峰转下划线
   */
  public static String humpToUnderline(String str) {
    System.out.println(str);
    String regex = "([A-Z])";
    Matcher matcher = Pattern.compile(regex).matcher(str);
    while (matcher.find()) {
      String target = matcher.group();
      str = str.replaceAll(target, "_"+target.toLowerCase());
    }
    return str;
  }

  /**
   * 下划线转驼峰
   */
  public static String underlineToHump(String str) {
    String regex = "_(.)";
    Matcher matcher = Pattern.compile(regex).matcher(str);
    while (matcher.find()) {
      String target = matcher.group(1);
      str = str.replaceAll("_"+target, target.toUpperCase());
    }
    return str;
  }

  public static String highlight(String content, String keyword) {
    StringBuilder result = new StringBuilder();
    Map<Integer,String> map = new HashMap<>();
    int startIndex = 0;	//关键字起始索引
    int endIndex = 0;	//关键字结尾索引
    boolean isOpen = false;	//进入关键字匹配标志
    for(int i=0; i<content.length(); i++) {	//遍历原始字符串
      for(char keyChar : keyword.toCharArray()) {	//遍历关键字字符串
        if(Character.toLowerCase(content.charAt(i)) == Character.toLowerCase(keyChar)) {
          if(!isOpen) {	//匹配到关键字第一个字符相等后
            startIndex = i;	//将起始索引赋值为当前遍历原始字符串索引
            endIndex = i;	//将结尾索引也赋值为相同到当前索引
            isOpen = true;	//标记进入匹配模式
          }
          if(isOpen) {		//判断是否处于匹配模式
            endIndex++;		//将结尾索引自增
          }
          i = endIndex;		//将遍历原始字符串到索引定位到结尾索引，避免重复遍历
        }else {
          isOpen = false;		//如果不相等则结束匹配模式
        }
      }
      if(endIndex - startIndex == keyword.length()) {	//如果结束索引与起始索引相减到值为关键字到长度则表明匹配到完整到关键字
        //将起始索引和结束索引对应到高亮标签put到哈希表中，并且重置匹配标识
        map.put(startIndex, "<font style='color:red'>");
        map.put(endIndex, "</font>");
        isOpen = false;

      }
    }
    //遍历原始字符串，通过哈希表中存储到高亮索引，将标签拼接到原始字符串里面
    for(int i=0; i<content.length(); i++) {
      result.append(map.getOrDefault(i, "")).append(content.charAt(i));
    }
    //下面这一行是用来处理特殊情况，即关键字在最后到情况
    result.append(map.getOrDefault(content.length(), ""));
    return result.toString();
  }
}
